<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const arr = [11, 2, 2, 4, 3, 7, 1];
        /*
            对arr进行冒泡排序就是两层for循环
                第一层for循环循环arr.length次，就是指每一次把数组中最大的元素移动到数组的最后
                第二层for循环循环arr.length-i次（i就是外层for的循环次数，表示最后的i个元素已经排好序了），这个for循环就是两两比较，一直把比较大的那个元素后移
        */
        function bubbleSort(arr) {
            for(let i = 0; i < arr.length - 1; i ++) {
                for(let j = 0; j < arr.length - 1 - i; j ++) {
                    if(arr[j] > arr[j + 1]) {
                        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
                    }
                }
            }
            return arr;
        }
        console.log(bubbleSort(arr))
        console.log(bubbleSort([]))
        /*
            优化思路：
                最外层for的目的就是每次让一个元素移动到最后（变得有序），让n个元素有序，循环只需要n - 1次即可 ——>  循环次数为(i = 1;i < arr.length - 1;)
                最外层每次循环体完成之后，数组都有可能已经为有序状态，所以我们在最外层循环的循环体中增加判断数组是否有序的逻辑来及时跳出循环
        */
        function bubbleSort_improved(arr) {
            for(let i = 1; i < arr.length - 1; i ++) {
                let isSorted = true;
                for(let j = 0; j < arr.length - 1 - i; j ++) {
                    if(arr[j] > arr[j + 1]) {
                        /*
                            进来这个if，就说明当前这一轮还不是有序数组
                        */
                        isSorted = false;
                        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
                    }
                }
                if(isSorted) {
                    break;
                }
            }
            return arr;
        }
    </script>
</body>
</html>